// DAO/BaseDao.java
package com.hp.DAO; // 声明包：DAO（存放所有数据访问层接口与基类）

import com.hp.Util.RowMapper;           // 导入行映射接口，用于把 ResultSet 的一行映射为实体
import com.hp.Util.SimpleJdbcTemplate;  // 导入简化的 JDBC 模板，封装了常用数据库操作
import java.util.List;           // 导入集合 List

/**
 * BaseDao：DAO 实现类的公共父类，封装常用的 JDBC 调用
 * 子类继承后可直接使用 execUpdate/execInsertReturnId/queryOne/queryList 减少重复代码
 */
public abstract class BaseDao {                      // 定义抽象基类，供各具体 DAO 实现继承
    protected final SimpleJdbcTemplate jdbc;         // 持有 JDBC 模板实例，供子类复用

    protected BaseDao(SimpleJdbcTemplate jdbc) {     // 通过构造器注入 JDBC 模板
        this.jdbc = jdbc;                            // 赋值保存
    }

    protected int execUpdate(String sql, Object... params) {     // 执行 INSERT/UPDATE/DELETE，并返回受影响行数
        return jdbc.update(sql, params);                          // 调用模板的 update 完成执行
    }

    protected long execInsertReturnId(String sql, Object... params) { // 执行 INSERT 并返回自增主键
        return jdbc.insertAndReturnId(sql, params);                  // 调用模板封装的方法
    }

    protected <T> T queryOne(String sql, RowMapper<T> mapper, Object... params) { // 查询单个对象（查不到返回 null）
        return jdbc.queryOne(sql, mapper, params);                                 // 使用模板执行查询
    }

    protected <T> List<T> queryList(String sql, RowMapper<T> mapper, Object... params) { // 查询对象列表
        return jdbc.query(sql, mapper, params);                                           // 使用模板执行查询
    }
}
